
#pragma once

#include "replacer.h"  // 包含 Replacer 接口定义
#include <list>
#include <mutex>
#include <unordered_map>

/**
 * LRU (Least Recently Used) 替换器
 * 使用双向链表 + 哈希表实现 O(1) 插入、淘汰、删除
 */
class LRUReplacer : public Replacer {
private:
    size_t max_size_;                                   // 缓冲池最大帧数
    std::list<frame_id_t> lru_list_;                    // LRU 链表：front 是最近使用，back 是最久未使用
    std::unordered_map<frame_id_t, std::list<frame_id_t>::iterator> lru_map_; // 帧ID → 链表迭代器
    mutable std::mutex latch_;                          // 互斥锁，保证线程安全

public:
    /**
     * 构造函数
     * @param max_size 缓冲池大小（帧数量）
     */
    explicit LRUReplacer(size_t max_size);

    /**
     * 析构函数
     */
    ~LRUReplacer() = default;

    /**
     * 将一个帧加入可替换候选集（pin_count 变为 0）
     * @param frame_id 帧 ID
     */
    void Insert(frame_id_t frame_id) override;

    /**
     * 获取一个受害者帧（最久未使用的帧）
     * @param[out] frame_id 输出参数：受害者帧 ID
     * @return 成功返回 true，无可替换帧返回 false
     */
    bool Victim(frame_id_t* frame_id) override;

    /**
     * 从候选集中移除一个帧（例如该页被 pin 住或删除）
     * @param frame_id 要移除的帧 ID
     * @return 是否成功移除
     */
    bool Erase(frame_id_t frame_id) override;

    /**
     * 获取当前可替换的帧数量
     * @return 可替换帧数量
     */
    size_t Size() override;
};